package com.zw.a.basic.a13.demo13_callable;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

//案例: 测试类, 演示线程池的第二种实现方式.
/*
    线程池简介:
        就是一个池子(容器), 里边有一些线程对象, 用的时候从里边拿, 用完之后再放回去.
        这样做的目的是: 节约资源, 提高效率.
    涉及到的API:
        线程池工厂类:  Executors
            public static ExecutorService newFixedThreadPool(int nThreads);  创建线程池, 并指定对应个数的线程对象.
            public static ExecutorService newCachedThreadPool();             创建线程池, 可根据需求来创建新的线程对象, 针对于生命周期短的线程对象, 效率更高.
        ExecutorService: 线程池接口
            public Future submit(Runnable task);        提交任务, 由线程池自动分配线程对象, 来执行该任务, 任务执行完毕后, 线程对象会被自动回收.
            public Future submit(Callable task);        提交任务, 由线程池自动分配线程对象, 来执行该任务, 任务执行完毕后, 线程对象会被自动回收.
            public void shutdown()                      关闭线程池.

 */
public class Demo {
    public static void main(String[] args) throws Exception {
        //1. 创建线程池对象.
        ExecutorService service = Executors.newFixedThreadPool(5);
        //2. 提交任务.
        Future future = service.submit(new MyCallable());       //future是线程执行后, 用于接收 线程返回结果的.
        //3. 接收线程执行后的返回值.
        Object obj = future.get();
        System.out.println(obj);
        //4. 关闭线程池.
        service.shutdown();
    }
}
